#include "aluno_bo.h"

int handle_create_aluno() {
    Aluno *aluno = NULL;
    //Curso *curso = NULL;

    aluno = (Aluno *) malloc(sizeof (Aluno));
    if (!aluno) {
        printf(INSUFICIENT_MEMORY, __FILE__);
        return PROC_FAILURE;
    }

    printf("Cadastro de Aluno\n");
    puts("Nome do aluno: ");
    printf(DEFAULT_BASH);
    __fpurge(stdin);
    // scanf com %n[^\n] funciona somente com strings! serve para remover o \n do Enter.
    scanf("%255[^\n]", aluno->nome);
    puts("Curso: ");
    printf(DEFAULT_BASH);
    /*
        __fpurge(stdin);
        scanf("%255[^\n]", aluno->curso);
        fflush(stdin);
     */
    // TODO: listar cursos e usuário escolhe qual.
    int max_choice_curso = curso_size();
    int id_curso = NOT_FOUND;
    do {
        read_all_curso();
        printf("<!> ID deve estar entre %d e %d\n", SEQ_BEGIN_NUMBER, max_choice_curso);
        puts("Entre com o ID do Curso: ");
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%d", &id_curso);
    } while (not(id_curso >= SEQ_BEGIN_NUMBER && id_curso <= max_choice_curso));

    aluno->curso_id = id_curso;
    printf("\n\tCOD Curso %d\n\n", aluno->curso_id); // just for debug

    if (create_aluno(aluno) != PROC_SUCCESS) {
        free(aluno);
        return PROC_FAILURE;
    } else {
        free(aluno);
        return PROC_SUCCESS;
    }
}

int handle_find_aluno() {
    // TODO: perguntar se a busca é pela matricula ou pelo nome.
    Aluno *aluno;
    Curso *curso = NULL;
    char search[100];
    puts("Buscar por Matricula[1] ou por Nome[2]: ");
    printf(DEFAULT_BASH);
    __fpurge(stdin);
    scanf("%1[^\n]", search);
    Buscar_por buscar_por;
    buscar_por = atoi(search);
    switch (buscar_por) {
        case matricula:
            /* busca pela matricula*/
            puts("Digite ID: ");
            printf(DEFAULT_BASH);
            __fpurge(stdin);
            scanf("%3[^\n]", search);
            aluno = find_aluno(search, buscar_por);
            if (aluno == NULL) {
                printf("Erro %s.\n", __FILE__);
                return PROC_FAILURE;
            } else if (aluno->matricula == NOT_FOUND) {
                printf("Aluno não encontrado.\n");
                return PROC_FAILURE;
            } else {
                curso = get_curso(aluno->curso_id);
                printf("%03d %s, %s.\n\n", aluno->matricula, aluno->nome, curso->descricao);
            }
            free(curso);
            free(aluno);
            break;
        case nome:
            /* busca pelo nome*/
            puts("Digite nome: ");
            printf(DEFAULT_BASH);
            __fpurge(stdin);
            scanf("%255[^\n]", search);
            aluno = find_aluno(search, buscar_por);
            if (aluno == NULL) {
                printf("Erro %s.\n", __FILE__);
                return PROC_FAILURE;
            } else if (aluno->matricula == NOT_FOUND) {
                printf("Aluno não encontrado.\n");
                return PROC_FAILURE;
            } else {
                curso = get_curso(aluno->curso_id);
                printf("%03d %s, %s.\n\n", aluno->matricula, aluno->nome, curso->descricao);
            }
            free(curso);
            free(aluno);
            break;
        default:
            return PROC_FAILURE;
    }
    return PROC_SUCCESS;
}

int handle_insert_notes() {
    Notas *notas = NULL;
    Aluno *aluno = NULL;
    Curso *curso = NULL;
    // requisita matricula do aluno
    char search_matricula[3];
    int id_disciplina = NOT_FOUND;
    char in[1];
    int max_choice_aluno = aluno_size();
    /* loop para escolher aluno */
    do {
        printf("<!> ID deve estar entre %d e %d\n", SEQ_BEGIN_NUMBER, max_choice_aluno);
        puts("Entre com a matricula do Aluno: ");
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%3[^\n]", search_matricula);

        /* caso matricula menor ou maior que o esperado. */
        while (not(atoi(search_matricula) >= SEQ_BEGIN_NUMBER && atoi(search_matricula) <= max_choice_aluno)) {
            printf("<!> ID deve estar entre %d e %d\n", SEQ_BEGIN_NUMBER, max_choice_aluno);
            puts("Entre com a matricula do Aluno: ");
            printf(DEFAULT_BASH);
            __fpurge(stdin);
            scanf("%3[^\n]", search_matricula);
        }

        read_aluno(atoi(search_matricula));
    } while (are_u_sure(in) != false);

    aluno = find_aluno(search_matricula, matricula);
    curso = get_curso(aluno->curso_id);
    // DONE: mostrar curso do aluno.
    // TODO: mostrar as disciplinas - manel
    puts("Entre com o ID da disciplina: ");
    printf(DEFAULT_BASH);
    __fpurge(stdin);
    scanf("%d", &id_disciplina);
    // TODO: validar a disciplina.

    notas = (Notas *) malloc(sizeof (Notas));

    if (!strcmp(curso->nivel, "SUPERIOR")) {
        _insert_notes_superior(notas);
        /* imprime media */
        printf("%-8s %-8s %-8s %-8s\n", "Nota 1", "Nota 2", "Nota 3", "Média");
        puts("-------- -------- -------- --------");
        printf("%-8.2f %-8.2f %-8.2f %-8.2f\n\n", notas->nota_1, notas->nota_2, notas->nota_3, calc_notes_superior(notas));
    } else {
        _insert_notes_tecnico(notas);
        /* imprime media */
        printf("%-8s %-8s %-8s\n", "Nota 1", "Nota 2", "Média");
        puts("-------- -------- --------");
        printf("%-8.2f %-8.2f %-8.2f\n\n", notas->nota_1, notas->nota_2, calc_notes_tecnico(notas));
    }
    /**
     * Salvar as notas no arquivo.
     */
    notas->id_aluno = aluno->matricula;
    notas->id_disciplina = id_disciplina;
    if (create_notas(notas) == PROC_SUCCESS) {
        free(curso);
        free(aluno);
        free(notas);
        return PROC_SUCCESS;
    } else {
        free(curso);
        free(aluno);
        free(notas);
        return PROC_FAILURE;
    }
}

/**
 * Preenche a struct Notas com as tres notas.
 * @param notas
 */
void _insert_notes_superior(Notas *notas) {
    printf("Entre com a nota 1: ");
    scanf("%f", &notas->nota_1);
    printf("Entre com a nota 2: ");
    scanf("%f", &notas->nota_2);
    printf("Entre com a nota 3: ");
    scanf("%f", &notas->nota_3);
}

void _insert_notes_tecnico(Notas *notas) {
    printf("Entre com a nota 1: ");
    scanf("%f", &notas->nota_1);
    printf("Entre com a nota 2: ");
    scanf("%f", &notas->nota_2);
}

float calc_notes_superior(Notas* notas) {
    return ( notas->nota_1 + (notas->nota_2 * 2) + (notas->nota_3 * 3)) / 6;
}

float calc_notes_tecnico(Notas* notas) {
    return (notas->nota_1 + notas->nota_2) / 2;
}

int handle_read_all_notes() {
    //Notas *notas = NULL;
    Aluno *aluno = NULL;
    Curso *curso = NULL;
    char search_matricula[3];
    char *in[1];
    int max_choice_aluno = aluno_size();
    /* loop para escolher aluno */
    do {
        printf("<!> ID deve estar entre %d e %d\n", SEQ_BEGIN_NUMBER, max_choice_aluno);
        puts("Entre com a matricula do Aluno: ");
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%3[^\n]", search_matricula);

        /* caso matricula menor ou maior que o esperado. */
        while (not(atoi(search_matricula) >= SEQ_BEGIN_NUMBER && atoi(search_matricula) <= max_choice_aluno)) {
            printf("<!> ID deve estar entre %d e %d\n", SEQ_BEGIN_NUMBER, max_choice_aluno);
            puts("Entre com a matricula do Aluno: ");
            printf(DEFAULT_BASH);
            __fpurge(stdin);
            scanf("%3[^\n]", search_matricula);
        }

        read_aluno(atoi(search_matricula));
    } while (are_u_sure(in) != false);

    aluno = find_aluno(search_matricula, matricula);
    printf("\n\tMatricula: %d\n", aluno->matricula); // just for debug
    curso = get_curso(aluno->curso_id);
    printf("\n\tNivel: %s\n", curso->nivel); // just for debug
    read_all_notes(aluno->matricula, curso->nivel);
    return PROC_SUCCESS;
}